导航菜单
首页 >  Spring + Security + JWT + Redis를 통한 회원인증허가 구현  > [Spring Security] 이메일 인증 회원가입 및 로그인 구현(1)

[Spring Security] 이메일 인증 회원가입 및 로그인 구현(1)

로그인: spring security의 form login을 사용하였다.회원가입: 단순한 회원가입 api구현이메일 인증: 네이버SMTP을 통해 인증 코드를 메일 발송하고, Redis를 통해 인증 코드 검증을 하였다.즉, 이메일 인증을 통한 서버 자체(소셜X) 회원가입 및 로그인에 필요한 Api는(1) 로그인 api (Controller가 아닌, 스프링 시큐리티의 formLogin을 사용함)(2) 회원가입 api(3) 이메일 인증 코드 발송 api(4) 이메일 인증 코드 검증 api총 4가지를 구현하였다.[Member.class]package BE.MyRoute.member.entity;import BE.MyRoute.member.entity.type.Role;import lombok.*;import javax.persistence.*;@Entity@Table(name = "member")@Getter@NoArgsConstructor(access = AccessLevel.PROTECTED)public class Member {@Id@GeneratedValue(strategy = GenerationType.IDENTITY)@Columnprivate Long memberId;@Columnprivate String email;@Columnprivate String password;@Columnprivate String nickname;@Column(name = "profile_image")private String profileImage;@Column@Enumerated(EnumType.STRING)private Role role;@Builderpublic Member(String email, String password, String nickname, String profileImage, Role role) {this.email = email;this.password = password;this.nickname = nickname;this.profileImage = profileImage;this.role = role;}}

※ 본 내용에 앞서, Member(User) 엔티티를 위와 같이 설계하였음을 알립니다.

"시작하기에 앞서"

이번 소셜 jwt 로그인에 이어 또 다른 프로젝트에서 일반 회원가입에서 회원의 인증을 위해 이메일 인증 기능을 넣게 되었다.

 

이메일 인증 코드는 google SMTP서버, Naver SMTP서버 등 다양한 서버를 사용해서 인증코드 메일을 전송할 수 있다.

이번에는 Naver STMP서버를 통한 메일 인증을 구현하였다.

[1. SMTP용 계정 설정]spring에서 mail 라이브러리를 통해 메일 인증 코드를 전송할 때 사용할 Naver SMTP서버를 활성화 시켜주어야한다.네이버 메일 서버를 외부에서 사용하기 위해서는 pop3/SMTP 설정을 필수로 활성화 시켜주어야한다.

네이버 메일을 들어가보면 왼쪽 하단에 "환경설정"을 눌러준다.

 

환경 설정 내부 카테고리에서 "POP3/IMAP 설정" ---> "POP3/SMTP 설정"에 들어온다.

 

위와 같이 설정해준다.

 

그리고!! 추후 spring에서 해당 SMTP서버와 연결을 하기 위해서 아래로 스크롤하면 보이는 

이 정보들을 application.properties나 application.yml에서 서버와 연결시켜 줄 예정임을 기억하자.

[2. Spring에서 의존성 및 properties파일 설정]spring와 Naver SMTP서버와 연결을 .properties 에서 설정하고연결한 서버로 메일을 만들어 보낼 수 있는 기능을 사용하기 위해 의존성을 추가해주어야한다.

[2-1 build.gradle]

spring에서 메일 서버와 연결해서 메일을 보내는 작업을 하는데 필요한 lib

[2-2 application.properties]

※ .yml 형식을 사용하고 있다면, https://mageddo.com/tools/yaml-converter 에서 쉽게 변환할 수 있다.

username에는 네이버 아이디를 (example123@naver.com)     password에는 네이버 비밀번호를 넣어준다.

위 내용은 처음 언급했던 Naver SMTP 계정 설정에서 나왔던 값들로 설정하면 된다.

 

[3. MailService 구현 tymeleaf 이용]

MemberService Interface를 먼저 살펴 보자.

createCode : Random 함수를 통해 난수로 된 이메일 인증 코드를 만드는 메소드

createEmailForm : 전송할 Email 형식 세팅(가령, 받는 사람/ 보내는 사람/ 메일 내부 내용 등)

sendEmail : createCode를 통해 인증코드를 만들고 createEmailForm을 통해 최종 메일 내용을 세팅하고 나서 toEmail 주소로 만든 이메일을 전송하는 메소드

verifyEmailCode : Redis를 사용. key-value를 email_addr - auth_code로 하여 이메일을 전송할 때, redis에 저장했던 인증코드와 요청값에 넘어온 인증번호를 비교하여 검증하는 메소드

 

[3-1 EmailServiceImpl (EmailService구현체)]

※이전에 추가적인 의존성 추가가 필요하다.

//thymeleafimplementation 'org.springframework.boot:spring-boot-starter-thymeleaf'//SpringTemplateEngine 객체 사용을 위한 의존성 추가implementation 'org.thymeleaf:thymeleaf-spring5'//redisimplementation 'org.springframework.boot:spring-boot-starter-data-redis'

 

import BE.MyRoute.util.RedisUtil;import lombok.RequiredArgsConstructor;import lombok.extern.slf4j.Slf4j;import org.springframework.beans.factory.annotation.Value;import org.springframework.mail.javamail.JavaMailSender;import org.springframework.stereotype.Service;import org.thymeleaf.context.Context;import org.thymeleaf.spring5.SpringTemplateEngine;import javax.mail.MessagingException;import javax.mail.internet.MimeMessage;import java.io.UnsupportedEncodingException;import java.util.Random;@Service@RequiredArgsConstructor@Slf4jpublic class EmailServiceImpl implements EmailService{//의존성 주입을 통해서 필요한 객체를 가져온다.private final JavaMailSender emailSender;// 타임리프를사용하기 위한 객체를 의존성 주입으로 가져온다private final SpringTemplateEngine templateEngine;private String authNum; //랜덤 인증 코드private final RedisUtil redisUtil;@Value("${spring.mail.username}")private String fromEmail;//랜덤 인증 코드 생성public void createCode() {Random random = new Random();StringBuffer key = new StringBuffer();for(int i=0;i

相关推荐: